package com.qianfeng.rabbitmq.publish;

//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//  


import com.qianfeng.rabbitmq.utils.ConnectionUtil;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * Created by Jackiechan on 2022/7/4 20:38
 *
 * @author Jackiechan
 * @version 1.0
 * @since 1.0
 */
public class ConsumerFanout1 {
    //队列的名字
    private static final String QUEUE_NAME = "fanoutqueue1";
    private static final String EXCAHNGE_NAME = "fanoutexchange";


    public static void main(String[] args) throws Exception {
        //连接mq
        Connection connection = ConnectionUtil.getConnection();
        //创建通道
        Channel channel = connection.createChannel();
        //声明交换机,类型是广播模式,会将消息发送到所有的绑定到交换机上面的队列中
        channel.exchangeDeclare(EXCAHNGE_NAME, "fanout");
        //声明队列,为了防止别人没声明
        //队列可以声明多次,但是只会创建一次. 但是需要注意,多次声明的参数必须保持一致
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        //绑定队列到交换机,这样交换机就知道自己上面有什么队列了,就知道消息要发送到什么地方
        channel.queueBind(QUEUE_NAME, EXCAHNGE_NAME, "");
        //监听这个队列,等待消息,参数1 要消费的队列,参数2 自动应答,就是告诉服务器消息我们收到了,那这样下次服务器就不会再给我发一次了
        //参数3 就是我们如何处理消息,在work模式下,改成手动应答
        channel.basicConsume(QUEUE_NAME,false,new DefaultConsumer(channel){
            /**
             * 处理消息的方法
             * @param consumerTag the <i>consumer tag</i> associated with the consumer
             * @param envelope packaging data for the message
             * @param properties content header data for the message
             * @param body the message body (opaque, client-specific byte array)
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.err.println("11111收到的消息是:"+new String(body));
                //当我们处理完消息后,需要给服务器一个应答,false代表只应答当前消息,不管之前的消息
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        });
    }
}
